package com.ruoyi.datastatistics.service;

import com.ruoyi.datastatistics.domain.AgegroupResult;
import com.ruoyi.datastatistics.domain.LevelgroupResult;

import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

public class LevelgroupResultSorter {

    public static List<LevelgroupResult> sortByCustomOrder(
            List<LevelgroupResult> listToSort,
            Function<LevelgroupResult, String> keyExtractor,
            List<String> customOrder) {

        // 创建顺序映射，存储每个值在自定义顺序中的位置
        Map<String, Integer> orderMap = new HashMap<>();
        for (int i = 0; i < customOrder.size(); i++) {
            orderMap.put(customOrder.get(i), i);
        }

        // 自定义比较器
        Comparator<LevelgroupResult> comparator = (a, b) -> {
            String keyA = keyExtractor.apply(a);
            String keyB = keyExtractor.apply(b);

            // 获取两个键在自定义顺序中的索引
            Integer indexA = orderMap.get(keyA);
            Integer indexB = orderMap.get(keyB);

            // 处理不在顺序列表中的情况
            if (indexA == null && indexB == null) {
                return keyA.compareTo(keyB); // 都不在时按自然顺序
            } else if (indexA == null) {
                return 1; // 不在顺序列表中的排在后面
            } else if (indexB == null) {
                return -1; // 不在顺序列表中的排在后面
            }

            return indexA.compareTo(indexB);
        };

        // 创建新列表并排序（避免修改原列表）
        return listToSort.stream()
                .sorted(comparator)
                .collect(Collectors.toList());
    }
}
